package com.yuanzi.base.redis;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * string类型缓存
 * @author chengshx
 * @date 2017年5月9日
 */
@Service
public class StringRedisService {
	
	private static IRedisService redisService;
	
	@Autowired
	public void setRedisService(IRedisService redisService) {
		StringRedisService.redisService = redisService;
	}
	
	/**
	 * string类型缓存
	 * @author chengshx
	 * @param clazz 实体类
	 * @param key id或其他key
	 * @param value
	 */
	public static void set(Class<?> clazz, String key, String value) {
		key = RedisUtils.getStringKey(clazz, key);
		redisService.set(key, value);
	}
	
	/**
	 * string类型缓存
	 * @author chengshx
	 * @param className 自定义缓存
	 * @param key id或其他key
	 * @param value
	 */
	public static void set(String className, String key, String value) {
		key = RedisUtils.getStringKey(className, key);
		redisService.set(key, value);
	}
	
	/**
	 * string类型缓存，并设置过期时间
	 * @author chengshx
	 * @param clazz 实体类
	 * @param key id或其他key
	 * @param value
	 * @param seconds 过期时间，为null不过期
	 */
	public static void setEx(Class<?> clazz, String key, String value, Integer seconds) {
		key = RedisUtils.getStringKey(clazz, key);
		redisService.setEx(key, value, seconds);
	}
	
	/**
	 * string类型缓存，并设置过期时间
	 * @author chengshx
	 * @param className 自定义缓存
	 * @param key id或其他key
	 * @param value
	 * @param seconds 过期时间，为null不过期
	 */
	public static void setEx(String className, String key, String value, Integer seconds) {
		key = RedisUtils.getStringKey(className, key);
		redisService.setEx(key, value, seconds);
	}
	
	/**
	 * 获取string类型缓存
	 * @author chengshx
	 * @param clazz 实体类
	 * @param key id或其他key
	 * @return
	 */
	public static String get(Class<?> clazz, String key) {
		key = RedisUtils.getStringKey(clazz, key);
		return redisService.get(key);
	}
	
	/**
	 * 获取string类型缓存
	 * @author chengshx
	 * @param className 自定义缓存
	 * @param key id或其他key
	 * @return
	 */
	public static String get(String className, String key) {
		key = RedisUtils.getStringKey(className, key);
		return redisService.get(key);
	}
	
	/**
	 * 设置string key过期时间
	 * @author chengshx
	 * @param clazz 实体类
	 * @param key id或其他key
	 * @param seconds 过期时间
	 */
	public static void expire(Class<?> clazz, String key, Integer seconds) {
		key = RedisUtils.getStringKey(clazz, key);
		redisService.expire(key, seconds);
	}
	
	/**
	 * 设置string key过期时间
	 * @author chengshx
	 * @param className 自定义缓存
	 * @param key id或其他key
	 * @param seconds 过期时间
	 */
	public static void expire(String className, String key, Integer seconds) {
		key = RedisUtils.getStringKey(className, key);
		redisService.expire(key, seconds);
	}
	
	/**
	 * 删除string类型缓存
	 * @author chengshx
	 * @param clazz 实体类
	 * @param key id或其他key
	 */
	public static void del(Class<?> clazz, String key) {
		key = RedisUtils.getStringKey(clazz, key);
		redisService.del(key);
	}
	
	/**
	 * 删除string类型缓存
	 * @author chengshx
	 * @param className 自定义缓存
	 * @param key id或其他key
	 */
	public static void del(String className, String key) {
		key = RedisUtils.getStringKey(className, key);
		redisService.del(key);
	}
	
	/**
	 * 删除String 类型指定key的缓存
	 *
	 * @param keys
	 * @author louhf
	 */
	public static void del(String key){
		redisService.del(key);
	}
	
	/**
	 * setEx两种类型统一封装
	 * @param obj
	 * @param key
	 * @param value
	 * @param seconds
	 */
	public static void setEx(Object obj, String key, String value, Integer seconds) {
		if(obj instanceof String) {
			setEx((String) obj, key, value, seconds);
		}
		if(obj instanceof Class) {
			setEx((Class<?>) obj, key, value, seconds);
		}
	}
	
	/**
	 * get两种类型统一封装
	 * @param obj
	 * @param key
	 */
	public static String get(Object obj, String key) {
		if(obj instanceof String) {
			return get((String) obj, key);
		}
		if(obj instanceof Class) {
			return get((Class<?>) obj, key);
		}
		return null;
	}
	
	/**
	 * setEx两种类型统一封装
	 * @param obj
	 * @param key
	 */
	public static void del(Object obj, String key) {
		if(obj instanceof String) {
			del((String) obj, key);
		}
		if(obj instanceof Class) {
			del((Class<?>) obj, key);
		}
	}
	
	/**
	 * 递增num，num<0时递减
	 * @author chengshx
	 * @date 2017年8月7日
	 *
	 * @param className
	 * @param key
	 * @param num
	 */
	public static void incrBy(String className, String key, Long num) {
		key = RedisUtils.getStringKey(className, key);
		redisService.incrby(key, num);
	}
}
